/**
 * harmony.traiterRetour.TraiterRetourElo.java
 * @author xavier.miorcec@elomobile.com
 * @9 juil. 2009
 * @ELO_bernardi
 */
package com.elomobile.harmony.traiterRetour;


import java.io.File;
import java.util.ArrayList;
import java.util.StringTokenizer;

import org.apache.log4j.Logger;
import org.w3c.dom.Node;

import com.elomobile.harmony.dao.RequetesDAO;
import com.elomobile.harmony.utils.ConstantesHarmony;
import com.elomobile.utilitaire.parseurXmlVoyageV3.ReponseVoyage.ProtocoleTypeReponsePlanning;
import com.elomobile.utilitaire.parseurXmlVoyageV3.ReponseVoyage.ReponseVoyageActionType;
import com.elomobile.utilitaire.parseurXmlVoyageV3.ReponseVoyage.ReponseVoyageDoc;
import com.elomobile.utilitaire.parseurXmlVoyageV3.ReponseVoyage.ReponseVoyageEtapeAQuaiType;
import com.elomobile.utilitaire.parseurXmlVoyageV3.ReponseVoyage.ReponseVoyageEtapeDebutType;
import com.elomobile.utilitaire.parseurXmlVoyageV3.ReponseVoyage.ReponseVoyageEtapeFinType;
import com.elomobile.utilitaire.parseurXmlVoyageV3.ReponseVoyage.ReponseVoyageReponseType;
import com.elomobile.utilitaire.parseurXmlVoyageV3.ReponseVoyage.ReponseVoyageUniteFacturationType;
import com.elomobile.utilitaire.parseurXmlVoyageV3.VoyageV3.ElementType;
import com.elomobile.utilitaire.sgbd2.Sgbdr;

public class TraiterRetourElo {

	Logger logger = Logger.getLogger("TraitementRetour");

	private ProtocoleTypeReponsePlanning protocoleType;
	private String codeVoyage;
	private String codeVehicule;
	private RequetesDAO requetes;

	/**
	 * Initialisation du fichier é traiter dans un noeud xml
	 * @param file le fichier de retour XML (ELO_yyyymmddhhmmss.xml)
	 */
	public void traiterFichier(File file) {
		try {
			ReponseVoyageDoc doc = new ReponseVoyageDoc();
			Node noeud = doc.load(file.getAbsolutePath());
			doc.setEncoding("ISO-8859-1");
			protocoleType = new ProtocoleTypeReponsePlanning(noeud);
			if (protocoleType.getVoyage().hasMoyens()) {
				codeVehicule = protocoleType.getVoyage().getMoyens().getCodeVehicule().getValue();
				traiterEtapeADebut();
				traiterEtapeAQuai();
				traiterEtapeFin();
				traiterAction();
			}
		} catch (Exception e) {
			logger.error(e);
		}
	}

	/**
	 * Traitement de l'ensemble des balises EtapeDebut contenu dans le fichier XML de retour
	 */
	protected void traiterEtapeADebut() {
		try {
			codeVoyage = protocoleType.getVoyage().getCodeVoyage().getValue();
			int nbEtapeDebut = protocoleType.getVoyage().getEtapeDebutCount();
			for (int i = 0; i < nbEtapeDebut; i++) {
				ReponseVoyageEtapeDebutType etapeDebut = protocoleType.getVoyage().getEtapeDebutAt(i);
				// Récupération liste des actions mettre é jour les début d'étapes
				String codeEtape = etapeDebut.getCodeEtape().getValue();
				ArrayList<String> listeCodeActionAssocier = Sgbdr.bdd(this.logger).etape().recupererListeCodeAction(codeVoyage, codeEtape);
				String dateHeureDebutEtape = etapeDebut.getDateDebut().getValue().replaceAll("-", "") + "" + etapeDebut.getHeureDebut().getValue().replaceAll(":", "");
				for (String codeAction : listeCodeActionAssocier) {
					StringTokenizer token = new StringTokenizer(codeAction, "_");
					String noDossier = token.nextToken();
					String numeroBon = token.nextToken();
					String typeLigne = token.nextToken();
					requetes.updateDateHeureDebutBon(noDossier, numeroBon, typeLigne, codeVehicule, dateHeureDebutEtape, logger);
				}
			}
		} catch (Exception e) {
			logger.error(e);
		}
	}

	/**
	 * Traitement de l'ensemble des balises EtapeDebut contenu dans le fichier XML de retour
	 */
	protected void traiterEtapeAQuai() {
		try {
			codeVoyage = protocoleType.getVoyage().getCodeVoyage().getValue();
			int nbEtapeAQuai = protocoleType.getVoyage().getEtapeAQuaiCount();
			for (int i = 0; i < nbEtapeAQuai; i++) {
				ReponseVoyageEtapeAQuaiType etapeAQuai = protocoleType.getVoyage().getEtapeAQuaiAt(i);
				// Récupération liste des actions mettre é jour les début d'étapes
				String codeEtape = etapeAQuai.getCodeEtape().getValue();
				ArrayList<String> listeCodeActionAssocier = Sgbdr.bdd(this.logger).etape().recupererListeCodeAction(codeVoyage, codeEtape);
				String dateHeureDebutEtape = etapeAQuai.getDateAQuai().getValue().replaceAll("-", "") + "" + etapeAQuai.getHeureAQuai().getValue().replaceAll(":", "");
				for (String codeAction : listeCodeActionAssocier) {
					StringTokenizer token = new StringTokenizer(codeAction, "_");
					String noDossier = token.nextToken();
					String numeroBon = token.nextToken();
					String typeLigne = token.nextToken();
					requetes.updateDateHeureAQuaiBon(noDossier, numeroBon, typeLigne, codeVehicule, dateHeureDebutEtape, logger);
				}
			}
		} catch (Exception e) {
			logger.error(e);
		}
	}

	/**
	 * Traitement de l'ensemble des balises etapeFin contenu dans le fichier XML de retour
	 */
	protected void traiterEtapeFin() {
		try {
			int nbEtapeFin = protocoleType.getVoyage().getEtapeFinCount();
			for (int i = 0; i < nbEtapeFin; i++) {
				ReponseVoyageEtapeFinType etapeFin = protocoleType.getVoyage().getEtapeFinAt(i);
				String codeEtape = etapeFin.getCodeEtape().getValue();
				ArrayList<String> listeCodeActionAssocier = Sgbdr.bdd(this.logger).etape().recupererListeCodeAction(codeVoyage, codeEtape);
				String dateHeureDebutEtape = etapeFin.getDateFin().getValue().replaceAll("-", "") + "" + etapeFin.getHeureFin().getValue().replaceAll(":", "");
				for (String codeAction : listeCodeActionAssocier) {
					StringTokenizer token = new StringTokenizer(codeAction, "_");
					String noDossier = token.nextToken();
					String numeroBon = token.nextToken();
					String typeLigne = token.nextToken();
					requetes.updateDateHeureDebutFin(noDossier, numeroBon, typeLigne, codeVehicule, dateHeureDebutEtape, logger);
				}
			}
		} catch (Exception e) {
			logger.error(e);
		}
	}

	/**
	 * Traitement de l'ensemble des actions contenues dans le fichier XML de retour
	 */
	protected void traiterAction() {
		try {
			int nbAction = protocoleType.getVoyage().getActionCount();
			for (int i = 0; i < nbAction; i++) {
				ReponseVoyageActionType action = protocoleType.getVoyage().getActionAt(i);
				if (action.hasReponsesAction()) {
					traiterReponseAction(action);
				}

				if (action.hasLitigeAction()) {
					traiterLitigeAction(action);
				}

				if (action.hasUniteFacturation()) {
					traiterUniteFacturation(action);
				}
			}
		} catch (Exception e) {
			logger.error(e);
		}
	}

	/**
	 * Traite les unités facturations de l'action
	 * @param action
	 */
	protected void traiterUniteFacturation(ReponseVoyageActionType action) {
		try {
			int nbUnite = action.getUniteFacturationCount();
			String uniteRemonter = "";
			for (int i = 0; i < nbUnite; i++) {
				ReponseVoyageUniteFacturationType unite = action.getUniteFacturationAt(i);
				uniteRemonter = String.valueOf(unite.getQuantiteModifiee().getValue());
				StringTokenizer token = new StringTokenizer(unite.getCodeFacturation().getValue(), "_");
				String noDossier = token.nextToken();
				String numeroBon = token.nextToken();
				String typeLigne = token.nextToken();
				String typeAction = token.nextToken();
				requetes.updateQuantie(noDossier, numeroBon, typeLigne, codeVehicule, uniteRemonter, typeAction, logger);
			}

		} catch (Exception e) {
			logger.error(e);
		}
	}

	/**
	 * Traitement de toutes les réponses actions de la balise action passé en paramétre
	 * @param action l'action
	 */
	protected void traiterReponseAction(ReponseVoyageActionType action) {
		try {
			int nbReponseAction = action.getReponsesAction().getReponseActionCount();
			String photo = "";
			String signature = "";
			String codeBarre = "";
			String nbPaletteECharger = "0";
			String nbPaletteERendu = "0";
			String nbPaletteACharger = "0";
			String nbPaletteARendu = "0";
			for (int i = 0; i < nbReponseAction; i++) {
				ReponseVoyageReponseType reponse = action.getReponsesAction().getReponseActionAt(i);
				if (reponse.getCodeQuestion().getValue().equals("SCAN")) {
					codeBarre = reponse.getReponse().getValue();
				} else if (reponse.getCodeQuestion().getValue().equals("PHOTO")) {
					photo = reponse.getReponse().getValue();
				} else if (reponse.getCodeQuestion().getValue().equals("SIGNATURE")) {
					signature = reponse.getReponse().getValue();
				} else if (reponse.getCodeQuestion().getValue().equals("PAL_RENDU_E")) {
					nbPaletteERendu = reponse.getReponse().getValue();
				} else if (reponse.getCodeQuestion().getValue().equals("PAL_CHARG_E")) {
					nbPaletteECharger = reponse.getReponse().getValue();
				} else if (reponse.getCodeQuestion().getValue().equals("PAL_RENDU_A")) {
					nbPaletteARendu = reponse.getReponse().getValue();
				} else if (reponse.getCodeQuestion().getValue().equals("PAL_CHARG_A")) {
					nbPaletteACharger = reponse.getReponse().getValue();
				}
			}

			StringTokenizer token = new StringTokenizer(action.getCodeAction().getValue(), "_");
			String noDossier = token.nextToken();
			String numeroBon = token.nextToken();
			String typeLigne = token.nextToken();
			requetes.updateReponseAction(noDossier, numeroBon, typeLigne, codeVehicule, codeBarre, photo, signature, nbPaletteERendu, nbPaletteECharger, nbPaletteARendu, nbPaletteACharger, logger);
		} catch (Exception e) {
			logger.error(e);
		}
	}

	/**
	 * Traitement des litiges sur les actions.
	 * @param action l'action
	 */
	protected void traiterLitigeAction(ReponseVoyageActionType action) {
		try {
			String codeElement = action.getLitigeAction().getReponseAction().getCodeElement().getValue();
			String libelleElement = recupereLibelleElement(codeElement);
			StringTokenizer token = new StringTokenizer(action.getCodeAction().getValue(), "_");
			String noDossier = token.nextToken();
			String numeroBon = token.nextToken();
			String typeLigne = token.nextToken();
			requetes.updateLitigeAction(noDossier, numeroBon, typeLigne, codeVehicule, codeElement, libelleElement, logger);
		} catch (Exception e) {
			logger.error(e);
		}
	}

	/**
	 * Récupération du code element
	 * @param codeElement
	 * @return le libellé
	 */
	protected String recupereLibelleElement(String codeElement) {
		try {
			int nb = ConstantesHarmony.getInstance().getListe().getListe().getElementListeCount();
			for (int i = 0; i < nb; i++) {
				ElementType element = ConstantesHarmony.getInstance().getListe().getListe().getElementListeAt(i);
				if (codeElement.equals(element.getCodeElement().getValue())) {
					return element.getLibelle().getValue();
				}
			}
		} catch (Exception e) {
			logger.error(e);
		}

		return "";

	}

	/**
	 * @return the requetes
	 */
	public RequetesDAO getRequetes() {
		return requetes;
	}

	/**
	 * @param requetes the requetes to set
	 */
	public void setRequetes(RequetesDAO requetes) {
		this.requetes = requetes;
	}

}
